package util.model.common;

import util.util.annotation.FormatType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Map;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class FieldInfo {

    /**
     * 表名
     */
    @FormatType
    private String tableName;

    /**
     * 表名---数据库
     */
    @FormatType
    private String tableDBName;

    /**
     * 表名注释
     */
    @FormatType
    private String tableTitle;

    /**
     * 字段名称
     */
    @FormatType
    private String fieldName;

    /**
     * 字段名称---数据库
     */
    @FormatType
    private String fieldDBName;

    /**
     * 字段名称---DTO
     */
    @FormatType
    private String fieldDTOName;

    /**
     * 字段名称2---其他
     */
    @FormatType
    private String fieldName2;

    /**
     * 字段注释
     */
    @FormatType
    private String fieldTitle;

    /**
     * 字段长度
     */
    @FormatType
    private String fieldLength;

    /**
     * 字段精度
     */
    @FormatType
    private String fieldScale;

    /*
     * 字段类型
     */
    @FormatType
    private String fieldType;

    /*
     * 字段类型---数据库
     */
    @FormatType
    private String fieldDBType;

    /**
     * 是否主键
     */
    @FormatType
    private String fieldPK;

    /**
     * 是否必填
     */
    @FormatType
    private String fieldMust;

    /**
     * 是否必填
     */
    @FormatType
    private String fieldDBMust;

    /**
     * 字段值
     */
    @FormatType
    private Object fieldValue;

    /**
     * 默认值
     */
    @FormatType
    private String fieldDefaultValue;

    /**
     * 导出转换--字段名--导出帮定用
     */
    @FormatType
    private String exportName;

    /**
     * 导出转换--字段转换（如 1 -》 已认证）
     */
    @FormatType
    private Map<String, String> convertValue;

    /**
     * 实体自动转换用--新名称
     */
    @FormatType
    private String fieldNewName;

    /**
     * 实体自动转换用--日期格式化（原来的实体是字符串，转换为实体需要的格式）
     */
    @FormatType
    private String formatStr;

    /**
     * 导出--对其方式（默认左对齐）
     */
    @FormatType
    private boolean align;

    /**
     * 提交校验--运算公式--顺序
     */
    @FormatType
    private int formulaOrder;

    /**
     * 提交校验--运算公式
     */
    @FormatType
    private String formula;

    /**
     * 提交校验--是否把运算的结果赋值给字段 true: 赋值  false : 校验
     */
    @FormatType
    private boolean assignment;

    /**
     * 提交校验--提交的数据，是否不能为空， true : 不能为空， false : 可为空（默认）
     */
    @FormatType
    private boolean postNotNull;

    /**
     * 提交校验--提交的数据，是否不能为空和 空字符串，长度为0等 ， true : 不能为空， false : 可为空（默认）
     */
    @FormatType
    private boolean postNotEmpty;


    // 导出--初始化
    public FieldInfo(String fieldName, String fieldTitle) {
        this.fieldName = fieldName;
        this.fieldTitle = fieldTitle;
    }

    // 导出--初始化
    public FieldInfo(String fieldName, String fieldTitle, String fieldScale, boolean align) {
        this.fieldName = fieldName;
        this.fieldTitle = fieldTitle;
        this.fieldScale = fieldScale;
        this.align = align;
    }

    // 导出转换--初始化
    public FieldInfo(String fieldName, String exportName, Map<String, String> convertValue) {
        this.fieldName = fieldName;
        this.exportName = exportName;
        this.convertValue = convertValue;
    }

    // 实体自动转换用--初始化
    public FieldInfo(String fieldName, String fieldNewName, String fieldLength, String fieldScale, String formatStr) {
        this.fieldName = fieldName;
        this.fieldNewName = fieldNewName;
        this.fieldLength = fieldLength;
        this.fieldScale = fieldScale;
        this.formatStr = formatStr;
    }

    // 提交校验--初始化
    public FieldInfo(String fieldName, String fieldTitle, int formulaOrder, String formula, String fieldLength,
                     String fieldScale, boolean assignment, boolean postNotNull, boolean postNotEmpty) {
        this.fieldName = fieldName;
        this.fieldTitle = fieldTitle;
        this.formulaOrder = formulaOrder;
        this.formula = formula;
        this.fieldLength = fieldLength;
        this.fieldScale = fieldScale;
        this.assignment = assignment;
        this.postNotNull = postNotNull;
        this.postNotEmpty = postNotEmpty;
    }


}
